﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Data;
using Bussiness;

namespace hostal
{
    public partial class EditarReserva : Form
    {
        private string numeroHabitacion,fechaLlegada,numeroDocumento,fechaRegistro,fechaRegistroActual;
        bool click = false;
        bool fechaIngresoIncorrecto, fechaSalidaIncorrecto = true;   
        private DataTable dataTableTemporal = new DataTable();
        private manejadorReservas habitacionesDisponibles = new manejadorReservas();
        private manejadorFechas fechas = new manejadorFechas();
        public List<string> coleccionHabitacionesDisponibles { get; set; }
        public List<string> coleccionCapacidadHabitacionesDisponibles = new List<string>();
        private bool registro = false;

        public EditarReserva(string numeroDocumento, string fechaLlegada, string fechaSalida, string fechaRegistro, DataTable dt)
        {
            InitializeComponent();
            habitacionDataAccess habitaciones = new habitacionDataAccess();
            dataTableTemporal = habitaciones.buscartipoHabitaciones();
            dg.DataSource = dataTableTemporal;

            for (int i = 0; i < dg.RowCount; i++)
            {
                CBTipoHabitacion.Items.Add(dg.Rows[i].Cells["tipo"].Value);
            }
            CBTipoHabitacion.Text = CBTipoHabitacion.Items[0].ToString();

            this.numeroDocumento = numeroDocumento;
            this.fechaRegistro = fechaRegistro;
            this.fechaLlegada = fechaLlegada;
            fechaRegistroActual = fechas.crearFechaActual();
            
            DGHabitacionesDisponibles.Columns.Add("numero", "numero habitacion");
            DGHabitacionesDisponibles.Columns.Add("tipo", "tipo");
            DGHabitacionesDisponibles.Columns.Add("capacidad", "capacidad");

            DGHabitacionesReservadas.Columns.Add("numeroHabitacion", "numero habitacion");
            DGHabitacionesReservadas.Columns.Add("tipo", "tipo");
            DGHabitacionesReservadas.Columns.Add("capacidad", "capacidad");

            DGVerDetalleReserva.DataSource = dt;
            for (int i = 0; i < DGVerDetalleReserva.Rows.Count; i++)
            {
                DGHabitacionesReservadas.Rows.Add(DGVerDetalleReserva.Rows[i].Cells["numeroHabitacion"].Value.ToString(), DGVerDetalleReserva.Rows[i].Cells["tipo"].Value.ToString(), DGVerDetalleReserva.Rows[i].Cells["capacidad"].Value.ToString());
                
                ReservasDataAccess cancelarReserva = new ReservasDataAccess();
                numeroHabitacion=DGVerDetalleReserva.Rows[i].Cells["numeroHabitacion"].Value.ToString();
                cancelarReserva.cancelarReserva(numeroHabitacion, numeroDocumento, fechaLlegada);
                LBHabitacionAntiguas.Text += numeroHabitacion+",";
            }

            DTFechaIngreso.Text = fechaLlegada;
            DTFechaSalida.Text = fechaSalida;

            llenarGridHabitacionesDisponibles(fechaLlegada, fechaSalida);

            ClienteDataAccess buscarCliente = new ClienteDataAccess();
            dataTableTemporal = buscarCliente.buscarDatos(numeroDocumento);
            DGCliente.DataSource = dataTableTemporal;
        }

        private void llenarGridHabitacionesDisponibles(string fechaIngreso, string fechaSalida)
        {
            coleccionHabitacionesDisponibles = habitacionesDisponibles.obtenerHabitacionesDisponibles(fechaIngreso, fechaSalida, CBTipoHabitacion.Text);
            coleccionCapacidadHabitacionesDisponibles = habitacionesDisponibles.obtenerCapacidadHabitacionesDisponibles(fechaIngreso, fechaSalida, CBTipoHabitacion.Text);

            for (int i = 0; i < DGHabitacionesDisponibles.Rows.Count; )
            {
                DGHabitacionesDisponibles.Rows.Remove(DGHabitacionesDisponibles.Rows[0]);
            }
            for (int i = 0; i < coleccionHabitacionesDisponibles.Count(); i++)
            {
                bool agregar = false;
                for (int j = 0; j < DGHabitacionesReservadas.Rows.Count; j++)
                {
                    agregar = coleccionHabitacionesDisponibles[i] == (DGHabitacionesReservadas.Rows[j].Cells["numeroHabitacion"].Value.ToString());
                    if (agregar)
                        j = DGHabitacionesReservadas.Rows.Count;
                }
                if (!agregar)
                    DGHabitacionesDisponibles.Rows.Add(coleccionHabitacionesDisponibles[i], CBTipoHabitacion.Text, coleccionCapacidadHabitacionesDisponibles[i]);
            }

            for (int j = 0; j < DGHabitacionesReservadas.Rows.Count; j++)
            {
                if (!coleccionHabitacionesDisponibles.Contains(DGHabitacionesReservadas.Rows[j].Cells["numeroHabitacion"].Value.ToString()) && DGHabitacionesReservadas.Rows[j].Cells["tipo"].Value.ToString() == CBTipoHabitacion.Text)
                    DGHabitacionesReservadas.Rows.Remove(DGHabitacionesReservadas.Rows[j]);
            }
        }

        private void BCancelar_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        private void BTBuscarCliente_Click(object sender, EventArgs e)
        {
            BuscarClienteReserva buscarClienteReserva = new BuscarClienteReserva("si");
            string numeroDocumento;
            if (buscarClienteReserva.ShowDialog() == DialogResult.OK)
            {
                numeroDocumento = buscarClienteReserva.numeroDocumento;
                ClienteDataAccess buscarCliente = new ClienteDataAccess();
                dataTableTemporal = buscarCliente.buscarDatos(numeroDocumento);
                DGCliente.DataSource = dataTableTemporal;
            }
        }

        private void BTAgregarHuesped_Click(object sender, EventArgs e)
        {
            Registrar_Reserva registrarClienteReserva = new Registrar_Reserva();
            registrarClienteReserva.ShowDialog();
        }

        private void TBBuscarHabitacionesDisponibles_Click(object sender, EventArgs e)
        {
            if (DTFechaIngreso.Value.Date <= DTFechaSalida.Value.Date)
                llenarGridHabitacionesDisponibles(DTFechaIngreso.Text, DTFechaSalida.Text);
            /*else
                MessageBox.Show("La fecha de salida no puede ser menor a la de ingreso");*/
        }

        private void BAceptar_Click(object sender, EventArgs e)
        {
            /*if (fechaIngresoIncorrecto = DTFechaIngreso.Value < System.DateTime.Today.Date)
                EPFechaIngreso.SetError(DTFechaIngreso, "La fecha de ingreso no puede ser menor a la actual");
            else
                EPFechaIngreso.Clear();*/
            if (fechaSalidaIncorrecto = DTFechaIngreso.Value > DTFechaSalida.Value)
                EPFechaSalida.SetError(DTFechaSalida, "La fecha de salida no puede ser menor a la ingreso");
            else
                EPFechaSalida.Clear();
            if (!fechaSalidaIncorrecto /*&& !fechaIngresoIncorrecto*/)
            {
                ReservasDataAccess cuentas = new ReservasDataAccess();
                try
                {
                    int fila = DGHabitacionesReservadas.CurrentRow.Index;
                    fila = DGCliente.CurrentRow.Index;
                    numeroDocumento = DGCliente.CurrentRow.Cells["numeroDocumento"].Value.ToString();
                    for (int i = 0; i < DGHabitacionesReservadas.Rows.Count; i++)
                    {
                        numeroHabitacion = DGHabitacionesReservadas.Rows[i].Cells["numeroHabitacion"].Value.ToString();
                        if (!cuentas.existeReserva(numeroDocumento, numeroHabitacion, DTFechaIngreso.Text, fechaRegistro))
                            cuentas.registrarReserva(numeroDocumento, numeroHabitacion, DTFechaIngreso.Text, DTFechaSalida.Text, fechaRegistroActual);
                        else
                            cuentas.activarReserva(numeroDocumento, numeroHabitacion, DTFechaIngreso.Text, DTFechaSalida.Text, fechaRegistroActual, fechaRegistro);
                    }
                    MessageBox.Show("Exito Al Registrar");
                    registro = true;
                    DGVerDetalleReserva.Dispose();
                    this.Close();
                }
                catch (SystemException exeption)
                {
                    if (DGCliente.Rows.Count == 0)
                        MessageBox.Show("Debe existir al menos una persona parta registrar");
                    else
                        MessageBox.Show("No se Registro Con Exito");
                }
            }
        }
        public string usuario { get; set; }

        private void BTAgregarHabitacion_Click(object sender, EventArgs e)
        {
            try
            {
                DGHabitacionesReservadas.Rows.Add(DGHabitacionesDisponibles.CurrentRow.Cells["numero"].Value.ToString(), DGHabitacionesDisponibles.CurrentRow.Cells["tipo"].Value.ToString(), DGHabitacionesDisponibles.CurrentRow.Cells["capacidad"].Value.ToString());
                DGHabitacionesDisponibles.Rows.Remove(DGHabitacionesDisponibles.CurrentRow);
            }
            catch (Exception exp) { }
        }

        private void BTQuitarHabitacion_Click(object sender, EventArgs e)
        {
            try
            {
                if (habitacionesDisponibles.estaHabitacionDisponible(DGHabitacionesReservadas.CurrentRow.Cells["numeroHabitacion"].Value.ToString()))
                    DGHabitacionesDisponibles.Rows.Add(DGHabitacionesReservadas.CurrentRow.Cells["numeroHabitacion"].Value.ToString(), DGHabitacionesReservadas.CurrentRow.Cells["tipo"].Value.ToString(), DGHabitacionesReservadas.CurrentRow.Cells["capacidad"].Value.ToString());
                else
                {
                    habitacionDataAccess obtenerCapacidad = new habitacionDataAccess();
                    string capacidad = obtenerCapacidad.obtenerTipoHabitacion(DGHabitacionesReservadas.CurrentRow.Cells["numeroHabitacion"].Value.ToString()).Rows[0].ItemArray.GetValue(0).ToString();
                    if (capacidad == CBTipoHabitacion.Text)
                    {
                        DGHabitacionesDisponibles.Rows.Add(DGHabitacionesReservadas.CurrentRow.Cells["numeroHabitacion"].Value.ToString(), CBTipoHabitacion.Text, capacidad);
                    }
                }
                DGHabitacionesReservadas.Rows.Remove(DGHabitacionesReservadas.CurrentRow);
                TBBuscarHabitacionesDisponibles_Click(sender, e);
            }
            catch (Exception exp) { }
        }

        private void EditarReserva_FormClosing(object sender, FormClosingEventArgs e)
        {
            try
            {
                if (!registro)
                {
                    for (int i = 0; i < DGVerDetalleReserva.Rows.Count; i++)
                    {
                        numeroHabitacion = DGVerDetalleReserva.Rows[i].Cells["numeroHabitacion"].Value.ToString();
                        ReservasDataAccess habilitarReserva = new ReservasDataAccess();
                        habilitarReserva.habilitarReserva(numeroHabitacion, numeroDocumento, fechaLlegada);
                    }
                }
            }
            catch (Exception exp) { }
        }

        private void DTFechaIngreso_ValueChanged(object sender, EventArgs e)
        {
            TBBuscarHabitacionesDisponibles_Click(sender, e);
        }

        private void DTFechaSalida_ValueChanged(object sender, EventArgs e)
        {
            TBBuscarHabitacionesDisponibles_Click(sender, e);
        }

        private void CBTipoHabitacion_SelectedValueChanged(object sender, EventArgs e)
        {
            if(click)
                TBBuscarHabitacionesDisponibles_Click(sender, e);
        }

        private void DTFechaIngreso_CloseUp(object sender, EventArgs e)
        {
            TBBuscarHabitacionesDisponibles_Click(sender, e);
        }

        private void DTFechaSalida_CloseUp(object sender, EventArgs e)
        {
            TBBuscarHabitacionesDisponibles_Click(sender, e);
        }

        private void CBTipoHabitacion_SelectionChangeCommitted(object sender, EventArgs e)
        {
            click = true;
        }

        private void CBTipoHabitacion_KeyPress(object sender, KeyPressEventArgs e)
        {
            e.Handled = true;
        }
    }
}
